Distributed applications can be highly complex. For instance, it is not uncommon for distributed applications to be configured to execute and/or utilize many hundreds of different types of services on many different host computers and/or virtual machine instances. Due to this complexity, many different types of factors might influence the performance of a distributed application. Consequently, it may be difficult to optimize the execution of a distributed application.
Different individuals within an organization might also have different ideas about what it means for a distributed application to be optimized. For example, one individual may desire to optimize execution of a distributed application for responsiveness (i.e. low latency), while another individual may desire to optimize execution of the same distributed application to minimize the monetary cost of executing the application. In this example, for instance, it may not be possible to optimize execution of the distributed application to minimize both cost and latency. Consequently, for this reason and others, it may be very difficult to optimize the execution of certain types of distributed applications.
It can also be difficult to optimize the execution of distributed applications that require high availability (i.e. uptime) because optimization of an application often involves experimentation. The possibility of downtime that might be caused by such experimentation, however, often outweighs the possible benefits that might be achieved from optimizing the execution of the distributed application. As a result, the execution of some types of distributed applications that require high availability is not optimized.
It is with respect to these and other considerations that the disclosure made herein is presented.